/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package estructurassa.controladores.Stock;

import autocompletar.logica.ModeloAutoCompletar;
import estructurassa.controladores.Controlador;
import estructurassa.controladores.ControladorPrincipal;
import estructurassa.controladores.FabricaControladores;
import estructurassa.entidades.Material;
import estructurassa.entidades.MovimientoStock;
import estructurassa.entidades.PedidoAProveedores;
import estructurassa.entidades.Pieza;
import estructurassa.estrategias.FabricaEstrategiasStock;
import estructurassa.expertos.ExpertoABMMaterial;
import estructurassa.expertos.ExpertoABMPedidoAProveedores;
import estructurassa.expertos.ExpertoStock;
import estructurassa.expertos.FabricaExpertos;
import estructurassa.expertos.excepciones.ABMPedidoAProveedoresException;
import estructurassa.expertos.excepciones.ExpertoStockException;
import estructurassa.utiles.modeloTabla.ModeloTabla;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import persistencia.exceptions.ExcepcionFachada;

/**
 *
 * @author diego
 */
public class ControladorStock implements Controlador {

    private PantallaStock pantalla;
    private ExpertoStock experto;
    private Pieza piezaSeleccionada;
    private boolean iniciado;
    private NuevoMovimientoJDialog nuevoMovJDialog;
    private IngresarOrdenCompraJDialog ingresarOrdenPedido;
    private PedidoAProveedores ordenSeleccionada;

    public ControladorStock() {
        pantalla = new PantallaStock();
        experto = (ExpertoStock) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.STOCK);
        pantalla.getTblDetalleStock().setModel(new ModeloTablaDetalleStock());

        nuevoMovJDialog = new NuevoMovimientoJDialog(null, true);
        nuevoMovJDialog.setLocationRelativeTo(null);

        ingresarOrdenPedido = new IngresarOrdenCompraJDialog(null, true);
        ingresarOrdenPedido.setLocationRelativeTo(null);

        pantalla.getBtnStock().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                seleccionarPieza();
            }
        });
        pantalla.getBtnNuevo().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                iniciarJDialogNuevoMov();
            }
        });
        pantalla.getBtnSalir().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                salir();
            }
        });
        pantalla.getBtnOrden().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                iniciarJDialogOrden();
            }
        });
        /**
         * ########################################################################
         * ########################################################################
         * Dialog Nuevo Movimiento
         * ########################################################################
         * ########################################################################
         */
        nuevoMovJDialog.getBtnGuardar().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                agregarMovimiento();
            }
        });
        nuevoMovJDialog.getBtnCancelar().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                nuevoMovJDialog.limpiarCampos();
                nuevoMovJDialog.setVisible(false);
            }
        });

        /**
         * ########################################################################
         * ########################################################################
         * Dialog Ingrear Orden Pedido
         * ########################################################################
         * ########################################################################
         */
        ingresarOrdenPedido.getTblDetalleOrden().setModel(new ModeloTablaDetalleOrdenPedido());
        ingresarOrdenPedido.getTblOrdenes().setModel(new ModeloTablaOrdenPedido());
        ingresarOrdenPedido.getTblOrdenes().getSelectionModel().addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                seleccionarOrdenPedido();
            }
        });
        ingresarOrdenPedido.getTblOrdenes().addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                seleccionarOrdenPedido();
            }
        });
        ingresarOrdenPedido.getBtnIngresarStock().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                ingresarOrdenPedido();
            }
        });
        ingresarOrdenPedido.getBtnCancelar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                ingresarOrdenPedido.setVisible(false);
            }
        });


    }

    @Override
    public JInternalFrame getPantalla() {
        return pantalla;
    }

    @Override
    public void iniciar() {
        if (!iniciado) {
            ((ControladorPrincipal) FabricaControladores.getInstance().getControlador(FabricaControladores.controladoresNombre.PRINCIPAL)).agregarPantallaInterna(pantalla);
            iniciado = true;
        }
        pantalla.setVisible(true);
        pantalla.toFront();

        List piezas = ((ExpertoABMMaterial) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.ABM_MATERIAL)).buscarPiezas();
        pantalla.getAutoCompletarPieza().setModelo(new ModeloAutoCompletar(piezas));

        iniciarTablasJDialogOrdenes();

    }

    private void iniciarTablasJDialogOrdenes() {
        ExpertoABMPedidoAProveedores pedidosAProveedores = (ExpertoABMPedidoAProveedores) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.ABM_PEDIDO_PROVEEDOR);
        ((ModeloTabla) ingresarOrdenPedido.getTblOrdenes().getModel()).setListaElementos(pedidosAProveedores.buscarPedidosEnviados());
    }

    public void mostrarStock() {
        if (piezaSeleccionada == null) {
            return;
        }
        if (piezaSeleccionada.getStock() == null) {
            try {
                experto.crearStock(piezaSeleccionada);
            } catch (ExcepcionFachada ex) {
                JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE);
                return;
            }
        }
        if (piezaSeleccionada.getStock().getMovimientos() != null) {
            ((ModeloTabla) pantalla.getTblDetalleStock().getModel()).setListaElementos(piezaSeleccionada.getStock().getMovimientos());
            pantalla.getLblCantTotal().setText(String.valueOf(piezaSeleccionada.getStock().getCantTotal()));
            pantalla.getLblCantTotal().setForeground(Color.blue);
        } else {
            ((ModeloTabla) pantalla.getTblDetalleStock().getModel()).setListaElementos(null);
            pantalla.getLblCantTotal().setText("0");
            pantalla.getLblCantTotal().setForeground(Color.red);
        }

    }

    private void seleccionarPieza() {
        piezaSeleccionada = (Pieza) pantalla.getAutoCompletarPieza().getItemSeleccionado();
        mostrarStock();
        mostrarModelo();
    }

    private void iniciarJDialogNuevoMov() {
        if (piezaSeleccionada != null) {
            nuevoMovJDialog.setVisible(true);
        }
    }

    private void agregarMovimiento() {
        if (piezaSeleccionada == null) {
            return;
        }
        MovimientoStock movimiento = new MovimientoStock();
        movimiento.setCantidad(Float.valueOf(nuevoMovJDialog.getTxtCantidad().getText()));
        movimiento.setFecha(new Date(nuevoMovJDialog.getjDateFecha().getDate().getTime()));
        movimiento.setObservacion(nuevoMovJDialog.getTxtDetalle().getText());
        if (nuevoMovJDialog.getCbxTipoMov().getSelectedItem().equals("Entrada")) {
            movimiento.setIsAlta(true);
        } else if (nuevoMovJDialog.getCbxTipoMov().getSelectedItem().equals("Salida")) {
            movimiento.setIsAlta(false);
        } else {
            JOptionPane.showMessageDialog(pantalla, "Debe Seleccionar Tipo de Movimiento", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
            return;
        }
        try {
            experto.guardarMovimientoStock(piezaSeleccionada, movimiento);
        } catch (ExpertoStockException ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
            return;
        } catch (ExcepcionFachada ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE);
            return;
        }
        JOptionPane.showMessageDialog(pantalla, "Stock Actualizado Correctamente", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
        mostrarStock();
        nuevoMovJDialog.limpiarCampos();
        nuevoMovJDialog.setVisible(false);
    }

    private void salir() {
        pantalla.setVisible(false);
    }

    private void iniciarJDialogOrden() {
        ingresarOrdenPedido.setVisible(true);
    }

    private void seleccionarOrdenPedido() {
        int fila = ingresarOrdenPedido.getTblOrdenes().getSelectedRow();
        if (fila == -1) {
            return;
        }
        int filaModelo = ingresarOrdenPedido.getTblOrdenes().convertRowIndexToModel(fila);
        ordenSeleccionada = (PedidoAProveedores) ((ModeloTabla) ingresarOrdenPedido.getTblOrdenes().getModel()).getRow(filaModelo);
        mostrarDetallesOrden(ordenSeleccionada);

    }

    private void mostrarDetallesOrden(PedidoAProveedores orden) {
        if (orden.getDetallesPedido().isEmpty()) {
            ((ModeloTabla) ingresarOrdenPedido.getTblDetalleOrden().getModel()).setListaElementos(null);
            return;
        }
        ((ModeloTabla) ingresarOrdenPedido.getTblDetalleOrden().getModel()).setListaElementos(orden.getDetallesPedido());
    }

    private void ingresarOrdenPedido() {
        if(ordenSeleccionada==null){
            return;
        }
        try {
            experto.ingresarPedido(ordenSeleccionada);
        } catch (ABMPedidoAProveedoresException ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(),"INFORMACIÓN",JOptionPane.INFORMATION_MESSAGE);
            return;
        } catch (ExcepcionFachada ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(),"ERROR",JOptionPane.ERROR_MESSAGE);
            return;
        }
        JOptionPane.showMessageDialog(pantalla, "Orden de Compra Ingresada Correctamente","INFORMACIÓN",JOptionPane.INFORMATION_MESSAGE);
        iniciarTablasJDialogOrdenes();
        ingresarOrdenPedido.setVisible(false);
    }

    private void mostrarModelo() {
        if (piezaSeleccionada != null) {
            pantalla.getTextoModelo().setText((piezaSeleccionada).getStock().getModelo().getNombre());
            pantalla.getTextoLoteOptimo().setText(FabricaEstrategiasStock.getInstancia().getEstrategiaStock(piezaSeleccionada).calcularLoteOptimo(piezaSeleccionada).toString());
            pantalla.getTextoPuntoDePedido().setText(FabricaEstrategiasStock.getInstancia().getEstrategiaStock(piezaSeleccionada).calcularPuntoPedido(piezaSeleccionada).toString());
            pantalla.getTextoStockDeSeguridad().setText(FabricaEstrategiasStock.getInstancia().getEstrategiaStock(piezaSeleccionada).calcularStockSeguridad(piezaSeleccionada).toString());
            
            pantalla.getTextoCGI().setText(FabricaEstrategiasStock.getInstancia().getEstrategiaStock(piezaSeleccionada).calcularCostoGestionInventario(piezaSeleccionada).toString());
        }
    }
}
